﻿using Microsoft.Extensions.DependencyInjection;
using System;
using System.Windows;

namespace Kevin
{
    public partial class App : Application
    {
        public IServiceProvider Services { get; }
        //定义一个静态属性保存App的状态
        //Application.Current返回的实际就是App类的实例，所以强转后可以获取Services
        //Application.Current 是一个静态属性，用于获取当前正在运行的 Application 实例
        //WPF应用程序在运行时只有一个Application实例。这个实例是由WPF框架在应用程序启动时自动创建的。
        //new表示定义一个与基类同名的新属性，隐藏基类的属性而不是重写
        //为了能够访问App中定义的额外成员Services，需要将Application.Current强制转换为App类型
        public static new App Current => (App)Application.Current;

        public App()
        {
            var container = new ServiceCollection();
            //任何地方获取AddSingleton注册的服务都是单例
            container.AddSingleton<MainWindow>();
            container.AddSingleton<MainViewModel>();
            //新建一个作用域并在其中获取AddScoped注册的服务是单例的
            //如果在作用域外获取是瞬时的
            container.AddScoped<Page1ViewModel>();
            container.AddScoped<Page2ViewModel>();
            container.AddScoped<Page3ViewModel>();

            Services = container.BuildServiceProvider();
        }

        protected override void OnStartup(StartupEventArgs e)
        {
            base.OnStartup(e);
            // GetRequiredService如果服务未注册抛出InvalidOperationException异常。
            // GetService如果服务未注册，返回 null
            // GetServices 用于获取某个类型的所有注册服务实例（适用于一个类型注册了多个实现的情况）。
            // GetServicesKeyed (.NET 8）根据键获取某个类型的所有注册服务实例
            MainWindow = Services.GetRequiredService<MainWindow>();
            // serviceProvider.GetService(typeof(IMyService));
            // serviceProvider.GetService<IMyService>();
            MainWindow.Show();
        }
    }
}
